package com.pacifico.telebusca.web.facade;

import java.io.File;
import java.io.Serializable;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;

import com.pacifico.telebusca.dominio.AudSistema;
import com.pacifico.telebusca.dominio.Audio;
import com.pacifico.telebusca.dominio.Empresa;
import com.pacifico.telebusca.dominio.UsuarioEmpresa;
import com.pacifico.telebusca.exception.Errores;
import com.pacifico.telebusca.servicio.AudSistemaServicio;
import com.pacifico.telebusca.servicio.AudioServicio;
import com.pacifico.telebusca.servicio.EmpresaServicio;
import com.pacifico.telebusca.servicio.UsuarioEmpresaServicio;
import com.pacifico.telebusca.servicio.xml.TeleBuscaAudio;
import com.pacifico.telebusca.web.beans.ValidacionErrores;
import com.pacifico.telebusca.web.util.Util;

@Service("teleBuscaFacade")
public class TeleBuscaFacade {

	@Autowired
	private EmpresaServicio empresaServicio;

	@Autowired
	private AudSistemaServicio audSistemaServicio;

	@Autowired
	private AudioServicio audioServicio;

	@Autowired
	private UsuarioEmpresaServicio usuarioEmpresaServicio;

	@Autowired
	private TeleBuscaAudio teleBuscaAudio;

	private AudSistema audSistema;

	public void registrarAuditoria(String codigoMensaje,
			String codigoMensajeLargo) {
		try {
			audSistema = new AudSistema(
					Util.obtenerNombreUsuario(SecurityContextHolder
							.getContext()), Util.getDate(),
					Errores.MAP.get(codigoMensaje),
					Errores.MAP.get(codigoMensajeLargo), Util.getDate(),
					Util.getDate(),
					Util.obtenerNombreUsuario(SecurityContextHolder
							.getContext()),
					Util.obtenerNombreUsuario(SecurityContextHolder
							.getContext()));
			this.audSistemaServicio.guardaAudSistema(audSistema);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}

	public void registrarAuditoria(String codigoMensaje,
			String codigoMensajeLargo, Long tiempo, String mensajeAdicional) {
		try {
			audSistema = new AudSistema(
					Util.obtenerNombreUsuario(SecurityContextHolder
							.getContext()), Util.getDate(),
					Errores.MAP.get(codigoMensaje),
					Errores.MAP.get(codigoMensajeLargo) + " "
							+ mensajeAdicional + " tiempo proceso " + tiempo,
					Util.getDate(), Util.getDate(),
					Util.obtenerNombreUsuario(SecurityContextHolder
							.getContext()),
					Util.obtenerNombreUsuario(SecurityContextHolder
							.getContext()));
			this.audSistemaServicio.guardaAudSistema(audSistema);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}

	public void registrarAuditoriaByNombreUsuario(String codigoMensaje,
			String codigoMensajeLargo, String nombreUsuario) {
		try {
			audSistema = new AudSistema(nombreUsuario, Util.getDate(),
					Errores.MAP.get(codigoMensaje),
					Errores.MAP.get(codigoMensajeLargo), Util.getDate(),
					Util.getDate(), nombreUsuario, nombreUsuario);
			this.audSistemaServicio.guardaAudSistema(audSistema);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}

	public void registrarAuditoriaByMensaje(String codigoMensaje,
			String mensaje, String nombreUsuario) {
		try {
			audSistema = new AudSistema(nombreUsuario, Util.getDate(),
					Errores.MAP.get(codigoMensaje), mensaje, Util.getDate(),
					Util.getDate(), nombreUsuario, nombreUsuario);
			this.audSistemaServicio.guardaAudSistema(audSistema);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}

	public ValidacionErrores validarArchivoXml(File xml) throws Exception {
		return this.teleBuscaAudio.validarArchivoXml(xml);
	}

	public File descargarArchivoResgistroNoValidos(List<Object> llamadas)
			throws Exception {
		return this.teleBuscaAudio.descargarArchivoResgistroNoValidos(llamadas);
	}

	public void guardarAudios(List<Object> llamadas, String nombreUsuario) {
		this.audioServicio.guardarAudios(llamadas, nombreUsuario);
	}

	public List<Audio> buscarAudios(Audio audio, Integer firstIndex,
			Integer maxNumber) {
		return this.audioServicio.buscarAudios(audio, firstIndex, maxNumber);
	}

	public int buscarContarAudios(Audio audio) {
		return this.audioServicio.buscarContarAudios(audio);
	}

	public List<Empresa> listarUsuariosyEmpresasByNombreUsuario(
			String nombreUsuario) throws Exception {
		return this.usuarioEmpresaServicio
				.listarUsuariosyEmpresasByNombreUsuario(nombreUsuario
						.toLowerCase());
	}

	/*public List<UsuariosEmpresasBean> listarUsuariosyEmpresasByNombreUsuarioAndCodEmpresa(
			String nombreUsuario, int codEmpresa) {
		return this.usuarioEmpresaServicio
				.listarUsuariosyEmpresasByNombreUsuarioAndCodEmpresa(
						nombreUsuario, codEmpresa);
	}*/

	public File descargarAudio(int codEmpresa, String path) throws Exception {
		return this.teleBuscaAudio.descargarAudio(codEmpresa, path);
	}

	public File descargarAudio(String urlAudio) throws Exception {
		return this.teleBuscaAudio.descargarAudio(urlAudio);
	}

	/*public List<UsuariosEmpresasBean> listarUsuariosyEmpresas() {
		return this.usuarioEmpresaServicio.listarUsuariosyEmpresas();
	}*/

	public Empresa actualizarEmpresa(Empresa empresa) {
		return this.empresaServicio.actualizarEmpresa(empresa);
	}

	public List<Empresa> listarEmpresas() {
		return this.empresaServicio.listarEmpresas();
	}

	public void eliminarEmpresa(int codEmpresa) {
		this.empresaServicio.eliminarEmpresa(codEmpresa);
	}

	public void guardarEmpresa(Empresa empresa) {
		this.empresaServicio.guardarEmpresa(empresa);
	}

	public UsuarioEmpresa actualizarUsuarioEmpresa(UsuarioEmpresa usuarioempresa) {
		return this.usuarioEmpresaServicio
				.actualizarUsuarioEmpresa(usuarioempresa);
	}

	public void eliminarUsuarioEmpresaByNombreUsuario(String nombreUsuario) {
		this.usuarioEmpresaServicio
				.eliminarUsuarioEmpresaByNombreUsuario(nombreUsuario);
	}

	public void guardarUsuarioEmpresa(UsuarioEmpresa usuarioempresa) {
		this.usuarioEmpresaServicio.guardarUsuarioEmpresa(usuarioempresa);
	}

	public Empresa buscarEmpresaPorCodigo(final Serializable codEmpresa) {
		return this.empresaServicio.buscarEmpresaPorCodigo(codEmpresa);
	}

	public void eliminarUsuarioEmpresaByCodEmpresa(int codEmpresa) {
		this.usuarioEmpresaServicio
				.eliminarUsuarioEmpresaByCodEmpresa(codEmpresa);
	}

	public List<UsuarioEmpresa> listarUsuariosyEmpresasAsignadas() {
		return this.usuarioEmpresaServicio.listarUsuariosyEmpresasAsignadas();
	}

	public List<Empresa> buscarEmpresaPorNombre(Serializable nombreEmpresa) {
		return empresaServicio.buscarEmpresaPorNombre(nombreEmpresa);
	}

	public List<UsuarioEmpresa> buscarUsuarioEmpresaByNombreUsuario(
			String nombreUsuario) {
		return usuarioEmpresaServicio
				.buscarUsuarioEmpresaByNombreUsuario(nombreUsuario);
	}

	public int buscarContarEmpresas() {
		return this.empresaServicio.buscarContarEmpresas();
	}

	public List<Empresa> buscarEmpresas(Integer firstIndex, Integer maxNumber) {
		return this.empresaServicio.buscarEmpresas(firstIndex, maxNumber);
	}
	
	public int buscarContarUsuarioEmpresas(){
		return usuarioEmpresaServicio.buscarContarUsuarioEmpresas();
	}

	public List<UsuarioEmpresa> buscarUsuarioEmpresas(Integer firstIndex, Integer maxNumber){
		return usuarioEmpresaServicio.buscarUsuarioEmpresas(firstIndex, maxNumber);
	}
	
	public List<Empresa> listarUsuariosyEmpresasAsignadasyPorAsignar(String nombreUsuario) {
		return usuarioEmpresaServicio.listarUsuariosyEmpresasAsignadasyPorAsignar(nombreUsuario);
	}
	
	
	
}
